package com.yfp.group.service;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerNotifyV3Result;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerRefundNotifyV3Result;
import com.yfp.goods.domain.ComboGroupDTO;
import com.yfp.group.domain.Enterprise;
import com.yfp.group.domain.EnterpriseOrder;
import com.yfp.group.domain.dto.ComboSettleDTO;
import com.yfp.group.domain.dto.EnterpriseOrderClientDTO;
import com.yfp.group.domain.dto.EnterpriseOrderDTO;
import com.yfp.group.domain.dto.SalesStatsClientDTO;
import com.yfp.group.domain.vo.*;

import java.util.Date;
import java.util.List;

/**
 * @author admin
 * @description 针对表【enterprise_order(企业订单)】的数据库操作Service
 * @createDate 2024-08-10 09:41:36
 */
public interface EnterpriseOrderService extends IService<EnterpriseOrder> {

    /**
     * 获取企业用户领取订单详情
     *
     * @param clientId
     * @return
     */
    List<ClientOrderVO> clientOrder(String clientId);

    /**
     * 企业订单列表
     *
     * @param enterpriseOrderDTO
     * @return
     */
    FirmOrderVO enterpriseOrderList(EnterpriseOrderDTO enterpriseOrderDTO);

    /**
     * 获取上架团餐列表
     *
     * @return
     */
    List<ComboGroupDTO> getGroupShelfComboList();

    /**
     * 套餐结算
     * 检测是否存在待支付订单
     *
     * @param comboSettleDTO
     * @return 订单编号
     */
    String settleCombo(ComboSettleDTO comboSettleDTO);

    /**
     * 检测是否存在待支付订单
     *
     * @return
     */
    Boolean hasWaitPayOrder();

    /**
     * 创建订单
     *
     * @param comboSettleDTO
     * @return 订单编号
     */
    String createOrder(ComboSettleDTO comboSettleDTO);

    /**
     * h5-订单-领餐二维码
     *
     * @return
     */
    EnterpriseOrderQrCodeInfoVO orderQrCodeInfo();

    /**
     * h5-订单-领餐二维码-根据订单号查询
     *
     * @param orderSn
     * @return
     */
    EnterpriseOrderQrCodeInfoVO orderQrCodeInfoByOrderSn(String orderSn);

    /**
     * 生成订单二维码
     *
     * @param enterpriseOrder
     * @param enterprise
     * @return
     */
    EnterpriseOrderQrCodeInfoVO generateQrCode(EnterpriseOrder enterpriseOrder, Enterprise enterprise);

    /**
     * 检测订单二维码是否显示
     * 检测销售日期是否是 今天的订单、明天的订单
     *
     * @param saleTime
     * @return
     */
    Boolean checkQrCodeShowTime(Date saleTime);

    /**
     * h5订单管理-订单列表
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<EnterpriseOrderListVO> orderList(Date startTime, Date endTime);

    /**
     * h5订单管理-取消订单
     *
     * @param orderSn
     */
    void orderCancel(String orderSn);

    /**
     * h5订单管理-订单详情
     *
     * @param orderSn
     * @return
     */
    EnterpriseOrderInfoVO orderInfo(String orderSn);


    /**
     * h5订单管理-支付订单详情
     *
     * @param orderSn
     * @return
     */
    EnterpriseOrderPayInfoVO orderPaymentInfo(String orderSn);

    /**
     * 订餐详情-套餐份数列表
     *
     * @param date
     * @return
     */
    List<SalesStatsComboVO> salesStatsCombo(Date date);

    /**
     * 订餐详情-房间号列表
     *
     * @param salesStatsClientDTO
     * @return
     */
    List<SalesStatsClientVO> salesStatsClient(SalesStatsClientDTO salesStatsClientDTO);

    /**
     * 套餐数据汇总
     *
     * @param enterpriseOrderDTO
     * @return
     */
    List<ComboVO> comboCollect(EnterpriseOrderDTO enterpriseOrderDTO);

    /**
     * 订单详情列表
     *
     * @param enterpriseOrderClientDTO
     * @return
     */
    List<EnterpriseOrderClientVO> orderDetail(EnterpriseOrderClientDTO enterpriseOrderClientDTO);

    /**
     * h5订单管理-立即支付-线上支付
     *
     * @param orderSn 订单编号
     * @param payType 支付方式
     * @param openId  微信用户openId
     * @return
     */
    Object orderPaymentWx(String orderSn, Integer payType, String openId);

    /**
     * h5订单管理-立即支付-余额支付
     *
     * @param orderSn 订单编号
     * @param payType 支付方式
     */
    void orderPaymentBalance(String orderSn, Integer payType);

    /**
     * 解析订单回调
     *
     * @param result
     */
    void parseOrderNotifyResult(WxPayPartnerNotifyV3Result.DecryptNotifyResult result);

    /**
     * 解析退款回调
     *
     * @param result
     */
    void parseRefundNotifyResult(WxPayPartnerRefundNotifyV3Result.DecryptNotifyResult result);

    /**
     * 查询订单状态,若订单状态改变则更新订单状态
     *
     * @param orderSn
     * @return
     */
    EnterpriseOrder getOrderStatus(String orderSn);

    /**
     * 订单管理列表导出
     *
     * @param enterpriseOrderDTO
     * @return
     */
    List<EnterpriseOrderVO> deriveEnterpriseOrder(EnterpriseOrderDTO enterpriseOrderDTO);

    /**
     * 根据企业订单生成投放计划
     *
     * @param outTradeNo
     */
    void generateDeliveryPlan(String outTradeNo);

    /**
     * 获取企业订单,已经被激活的订单
     * （状态:PAID(2, "已支付")、状态：AVAILABLE(1, "可用")）
     * doto 今日订单只有一个
     *
     * @param saleTime
     * @param enterpriseId
     * @return
     */
    List<EnterpriseOrder> selectAvailableByDateAndEnterpriseId(DateTime saleTime, Long enterpriseId);

    /**
     * 检测订单是否被激活
     * （状态:PAID(2, "已支付")、状态：AVAILABLE(1, "可用")）
     *
     * @param enterpriseOrder
     * @return
     */
    Boolean checkOrderAvailable(EnterpriseOrder enterpriseOrder);

    /**
     * 订单详情列表数据补全
     * @param list
     * @return
     */
    List<EnterpriseOrderClientVO> orderDetailComplement(List<EnterpriseOrderClientVO> list);

    void updateFinishTime(String enterpriseOrderSn);
}
